#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#include "case.h"


typedef struct
{
    int type;// 0:vide 1:ligne 2:colonne 3:lignecolonne 4:caseàremplir
    int nbcaseligne;
    int nbcasecolonne;
    int sommeligne;
    int sommecolonne;
    int valeur;
}casegrille;



int main()
{

    char combiLouC1[]="combiLouC1.txt";
    char valcase1[]="valcase1.txt";
    char combiLouC2[]="combiLouC2.txt";
    char valcase2[]="valcase2.txt";
    char valcase[]="valcase.txt";
    int p=0,puiss,f,caseUtilise=0,somme=0;
    int i=0,j=0;
    int tab[513][11]={{0,1,2,3,4,5,6,7,8,9}};
    puiss=pow(2,4);
/*remplir un tableau binaire pour pouvoir
apres extraire les differentes combinaisons possibles*/
for(i=0;i<=512;i++) {tab[i][0]=0;}
for(j=1;j<=9;j++)
{
        puiss=pow(2,j);
    for(i=1;i<=512;i+=puiss)
    {

        f=i+(puiss/2);

       for(p=i;(p<f);p++)
        {
            tab[p][j]=1;
            tab[p+puiss/2][j]=0;
        }
    }
}
/*remplir la 1er colonne par la somme de chaque ligne
et la derniere colonne par le nbre de chiffre utilisés
pour atteindre cette somme*/
for(i=1;i<=512;i+=1)
{
    somme=0;caseUtilise=0;
    for(j=1;j<=9;j+=1)
    {
        if(tab[i][j]==1) {somme+=j;caseUtilise+=1;}
    }
    tab[i][0]=somme;tab[i][10]=caseUtilise;

}
//afficher le tableau du combinaisons
/*for(i=0;i<=512;i++)
{
    for(j=0;j<=10;j++)
    {
    printf("%d ",tab[i][j]);
    }
   printf("\tligne %d\n",i);
}*/
listeCombinsPossibles(4,2,tab,combiLouC1);
/*exemple: extraire les differentes combinaison possibles qui permettre
d'obtenir la somme 17  en utilisant seulement 3 cases*/
listeCombinsPossibles(3,2,tab,combiLouC2);


val_possibles_case_ligneoucolonne(combiLouC1,valcase1);
/*stocker les valeurs possibles d'une case appartenant à une ligne
ou colonne et indépendement des autres lignes et colonnes
exemple: dans une ligne(8,3) chaque case a la possibilité de contenir
1 ou 2 ou 3 ou 4 ou 5 */
val_possibles_case_ligneoucolonne(combiLouC2,valcase2);
val_possibles_case_intersection(valcase1,valcase2,valcase);




 casegrille grille[4][4];
FILE *fichier,*grillevide;

int val=0,cc=0,l,c,m;

 grillevide=fopen("remplir.txt","r");
            if(grillevide==NULL){printf("erreur");}
            else
            {
                for(i=0;i<3;i++)
                {
                for(j=0;j<3;j++)
                {fscanf(grillevide,"%d %d %d %d %d %d\t",&grille[i][j].type,&grille[i][j].nbcaseligne,&grille[i][j].nbcasecolonne,&grille[i][j].sommeligne,&grille[i][j].sommecolonne,&grille[i][j].valeur);
                }}

            }
            fclose(grillevide);
 for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {

        if(!grille[i][j].type) printf("\t");
        else if(grille[i][j].type==3) printf("ligne:%d\\%d\t",grille[i][j].sommeligne,grille[i][j].sommecolonne);
        else if(grille[i][j].type==1) printf("\\%d\t",grille[i][j].sommeligne);
        else if(grille[i][j].type==2) printf("%d\\\t",grille[i][j].sommecolonne);
        else {if (grille[i][j].valeur){printf("%d\t",grille[i][j].valeur);}
        else printf(".\t");}
    }
    printf("\n");

}

for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {
printf("%d\t",grille[i][j].sommeligne);
    }
}


for(m=0;m<=1;m++)
{
for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {

        if((grille[i][j].type==4) &&(!grille[i][j].valeur))
        {
            printf("caseligne: %d",grille[i][j].nbcaseligne);
            printf("caseligne: %d",grille[i][j].nbcasecolonne);
            listeCombinsPossibles(grille[i][j].sommeligne,grille[i][j].nbcaseligne,tab,combiLouC1);
            listeCombinsPossibles(grille[i][j].sommecolonne,grille[i][j].nbcasecolonne,tab,combiLouC2);
            val_possibles_case_ligneoucolonne(combiLouC1,valcase1);
            val_possibles_case_ligneoucolonne(combiLouC2,valcase2);
            val_possibles_case_intersection(valcase1,valcase2,valcase);
                fichier=fopen(valcase,"r");
            if(fichier==NULL){printf("erreur");}
            else
            {
                cc=0;
                while(!feof(fichier))
                {
                fscanf(fichier,"%d ",&val);cc++;
                }

            }
            fclose(fichier);

            if(cc==1)
            {
                grille[i][j].valeur=val;l=i;c=j;
                do
                {

                    grille[i][c].sommeligne-=val;
                    grille[i][c].nbcaseligne--;

                    c--;
                }while(grille[i][c].type==4 || grille[i][c].type==0);
                c=j+1;
                while(grille[i][c].type)
                {

                    grille[i][c].sommeligne-=val;
                    grille[i][c].nbcaseligne--;
                    c++;

                }
                do
                {

                    grille[l][j].sommecolonne-=val;
                    grille[l][j].nbcasecolonne--;

                    l--;
                }while(grille[l][j].type==4 || grille[l][j].type==0);
                l=i+1;
                while(grille[l][j].type)
                {

                    grille[l][j].sommecolonne-=val;
                    grille[l][j].nbcasecolonne--;
                    l++;

                }
            }


        }

    }
    printf("\n");
}//fin


for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {

        if(!grille[i][j].type) printf("\t");
        else if(grille[i][j].type==3) printf("ligne:%d\\%d\t",grille[i][j].sommeligne,grille[i][j].sommecolonne);
        else if(grille[i][j].type==1) printf("\\%d\t",grille[i][j].sommeligne);
        else if(grille[i][j].type==2) printf("%d\\\t",grille[i][j].sommecolonne);
        else {if (grille[i][j].valeur){printf("%d\t",grille[i][j].valeur);}
        else printf(".\t");}
    }
    printf("\n");
}
}



for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {
printf("%d\t",grille[i][j].sommeligne);
    }
}
printf("\n");
for(i=0;i<=2;i++)
{
    for(j=0;j<=2;j++)
    {
printf("%d\t",grille[i][j].sommecolonne);
    }
}




return 0;
}


